package com.agencia.jsf;
import java.util.ArrayList;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.Iterator;
import java.util.List;

import javax.faces.component.html.HtmlDataTable;
import javax.faces.component.html.HtmlInputHidden;
import javax.faces.context.FacesContext;
import javax.faces.model.SelectItem;
import javax.servlet.http.HttpServletRequest;

import com.agencia.ws.cliente.AterrizarWSDelegate;
import com.agencia.ws.cliente.AterrizarWSService;
import com.agencia.ws.cliente.Clase;
import com.agencia.ws.cliente.VueloWs;
import com.sun.org.apache.xerces.internal.jaxp.datatype.XMLGregorianCalendarImpl;



import agencia.ReservaVuelo;

	
public class AdministrarReservasVueloBean {
	
	private HtmlDataTable 				dataTable;
    private ReservaVuelo				dataItem 			= new ReservaVuelo();
    private HtmlInputHidden 			dataItemId 			= new HtmlInputHidden();
    private HtmlInputHidden 			dataItemIdPaquete 	= new HtmlInputHidden();
    private HtmlInputHidden 			dataItemFecha 	 	= new HtmlInputHidden();
    private HtmlInputHidden 			dataItemCategoria 	= new HtmlInputHidden();
	private List<ReservaVuelo> 			reservas			= new ArrayList<ReservaVuelo>();
	private List<SelectItem>			vuelos;
	private int 						cantidad = 0;
	private int 						proximoId= 1;
	private Long						idPaquete;
	private int							categoria;
	private Date 						fecha;
	private String						nombreVuelo;
	
	

	public String getNombreVuelo() {
		return nombreVuelo;
	}


	public void setNombreVuelo(String nombreVuelo) {
		this.nombreVuelo = nombreVuelo;
	}


	public Date getFecha() {
		return fecha;
	}


	public void setFecha(Date fecha) {
		this.fecha = fecha;
	}


	public AdministrarReservasVueloBean() {
		traerRequest();
		cargar();
	}
		

	@SuppressWarnings("deprecation")
	private void cargar(){
		
		Date fechaExcursion = new Date("03/12/08");
		
		vuelos = new ArrayList<SelectItem>();
		ReservaVuelo reservaVuelo = new ReservaVuelo();		
		
		AterrizarWSService servicio = new AterrizarWSService();
		AterrizarWSDelegate delegate = servicio.getAterrizarWSPort();
		List<VueloWs> vuelosDisponibles = delegate.getVuelos("", "", new XMLGregorianCalendarImpl(new GregorianCalendar()), Clase.PRIMERA);
							
		Iterator<VueloWs> it = vuelosDisponibles.iterator();
		
		while (it.hasNext()){
			vuelos.add(new SelectItem(it.next()));
		}
		
		if (reservas.isEmpty()){
			reservaVuelo.setFechaLlegada(vuelosDisponibles.get(0).getFechaLlegada());
			reservaVuelo.setFechaPartida(vuelosDisponibles.get(0).getFechaPartida());
			reservaVuelo.setId(Long.valueOf(getProximoId()));
			reservaVuelo.setIdPaquete((Long) dataItemIdPaquete.getValue());
			reservaVuelo.setNroVuelo(vuelosDisponibles.get(0).getNroVuelo());

			reservas.add(reservaVuelo);
		}
		
		cantidad++;
		actualizarProximoId();
			
		/*
		ExcursionDAO excursionDAO = new ExcursionDAO();
		
		Criterion criterioCategoria = Restrictions.eq("categoria", dataItemCategoria.getValue());
		Criterion criterioFecha = Restrictions.ge("fecha", dataItemFecha.getValue());
		
		Criteria criterioExcursion = com.agencia.persistencia.HibernateSessionFactory.getSession().createCriteria(ExcursionMedioDia.class);
		
		criterioExcursion.add(criterioCategoria);
		criterioExcursion.add(criterioFecha);
		
		List<ExcursionMedioDia> listaExcursiones = criterioExcursion.list(); //excursionDAO.findAll();
		Iterator<ExcursionMedioDia> it = listaExcursiones.iterator();
		
		while (it.hasNext()){
			excursiones.add(new SelectItem(it.next()));
		}
		*/
		//List<ExcursionMedioDia> listaExcursiones = new ArrayList<ExcursionMedioDia>();
		
		//excursiones.add(new SelectItem(exc));
		
		/*
		ExcursionmediodiaDAO excursionDAO = new ExcursionmediodiaDAO();
		
		listaExcursiones =  excursionDAO.findAll();		
		
		Iterator<ExcursionMedioDia> it = listaExcursiones.iterator();
		excursiones = new ArrayList<SelectItem>();
		
		while(it.hasNext()){
			excursiones.add(new SelectItem(it.next()));
		}
		*/

	
		/*
		 * traer de la bd todas las reservas de excursiones cuyo idPaquete sea igual a idPaquete
		 */
	}
	
	public void actualizarProximoId(){
		proximoId++;		
	}
	
	public int getProximoId(){
		return proximoId;
	}
	
	public String crear() {
		dataItem = new ReservaVuelo();

		cantidad++;
		dataItemId.setValue(new Long(cantidad));
		
		return "editar";
	}

	public String editar() {
		// Obtengo la fila completa
	    dataItem = (ReservaVuelo) dataTable.getRowData();
	    dataItemId.setValue(dataItem.getId());
	
		return "editar";
	}
	
	private void persistirReserva(){
		
	}
	
	public String guardar() {
		
		dataItem.setId(Long.valueOf(dataItemId.getValue().toString()));
		if (cantidad > reservas.size()){
			VueloWs vuelo = new VueloWs();
			String vueloBuscado;
			int index;
			boolean notFound = true;
			
			index = this.nombreVuelo.indexOf("/");
			vueloBuscado = this.nombreVuelo.substring(0, index);
			
			AterrizarWSService servicio = new AterrizarWSService();
			AterrizarWSDelegate delegate = servicio.getAterrizarWSPort();
			List<VueloWs> vuelosDisponibles = delegate.getVuelos("", "", new XMLGregorianCalendarImpl(new GregorianCalendar()), Clase.PRIMERA);
								
			Iterator<VueloWs> it = vuelosDisponibles.iterator();
			
			while ((it.hasNext()) && (notFound)){
				vuelo = it.next();
				if (vuelo.getNroVuelo().equals(vueloBuscado)){
					notFound = false;
					dataItem.setVuelo(vuelo);
				}			
			}			
			dataItem.setId(Long.valueOf(getProximoId()));
			persistirReserva();
			reservas.add(dataItem);
			actualizarProximoId();
		}
		
		return "listar";
	}
	
	public String eliminar(){
		dataItem = (ReservaVuelo) dataTable.getRowData();
		eliminarReserva();
		reservas.remove(dataItem);
		cantidad--;
		return "listar";
	}
	private void eliminarReserva(){

	}
	
	public String listar() {
		return null;
	}
	
	public String volver() {
		// Si se creo uno nuevo, vuelvo el conteo hacia atras
		cantidad = reservas.size();

		return "volver";
	}
	
	public void traerRequest(){		

		FacesContext context = FacesContext.getCurrentInstance();		
		HttpServletRequest request= (HttpServletRequest)context.getExternalContext().getRequest();
		Long idPaquete 	= (Long)request.getSession().getAttribute("idPaquete");
		Long aux  		= (Long)request.getSession().getAttribute("categoria");
		Date fecha      = (Date)request.getSession().getAttribute("fecha");
		setIdPaquete(idPaquete);
		setCategoria(aux.intValue());
		setFecha(fecha);
		
		dataItemIdPaquete.setValue(new Long(getIdPaquete()));
		dataItemCategoria.setValue(aux.intValue());
		dataItemFecha.setValue(fecha);
	}

	//-------------------------------------
	
	public HtmlDataTable getDataTable() {
		return dataTable;
	}

	public void setDataTable(HtmlDataTable dataTable) {
		this.dataTable = dataTable;
	}

	public ReservaVuelo getDataItem() {
		return dataItem;
	}

	public void setDataItem(ReservaVuelo dataItem) {
		this.dataItem = dataItem;
	}

	public HtmlInputHidden getDataItemId() {
		return dataItemId;
	}

	public void setDataItemId(HtmlInputHidden dataItemId) {
		this.dataItemId = dataItemId;
	}

	public int getCantidad() {
		return cantidad;
	}

	public void setCantidad(int cantidad) {
		this.cantidad = cantidad;
	}

	public List<ReservaVuelo> getReservas() {
		//traerRequest();
		cargar();
		return reservas;
	}

	public void setReservas(List<ReservaVuelo> reservas) {
		this.reservas = reservas;
	}


	public HtmlInputHidden getDataItemIdPaquete() {
		return dataItemIdPaquete;
	}


	public void setDataItemIdPaquete(HtmlInputHidden dataItemIdPaquete) {
		this.dataItemIdPaquete = dataItemIdPaquete;
	}


	public Long getIdPaquete() {
		return idPaquete;
	}


	public void setIdPaquete(Long idPaquete) {
		this.idPaquete = idPaquete;
	}


	public List<SelectItem> getVuelos() {
		return vuelos;
	}


	public void setVuelos(List<SelectItem> vuelos) {
		this.vuelos = vuelos;
	}


	public int getCategoria() {
		return categoria;
	}


	public void setCategoria(int categoria) {
		this.categoria = categoria;
	}


	public HtmlInputHidden getDataItemCategoria() {
		return dataItemCategoria;
	}


	public void setDataItemCategoria(HtmlInputHidden dataItemCategoria) {
		this.dataItemCategoria = dataItemCategoria;
	}


	public HtmlInputHidden getDataItemFecha() {
		return dataItemFecha;
	}


	public void setDataItemFecha(HtmlInputHidden dataItemFecha) {
		this.dataItemFecha = dataItemFecha;
	}
}
